/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2025-04-24 11:14:03
 * @LastEditTime : 2025-05-29 00:26:47
 * @FilePath     : \PY32F071-DEMO\hal_drivers\ll_uart.h
 * @Description  : uart低层驱动
 * @Version      : V1.0
 * @History      :
 * @Note         :
 */

#ifndef __ll_uart_H__
#define __ll_uart_H__

/***************************************Includes***********************************/
#include <stdint.h>


/*************************************Public Macros********************************/
#define uart_ll_get_usr_arg(uart) ((uart)->arg)
#define uart_ll_get_tx_status(uart) ((uart)->txbuf_len)


/***********************************Public Statement*******************************/

struct uart_ll;
typedef struct uart_ll uart_ll_t;

typedef void (*uart_ll_rx_interrupt_cb_t)(uart_ll_t *ult, uint32_t data);
typedef void (*uart_ll_rx_done_interrupt_cb_t)(uart_ll_t *ult);

struct uart_ll {
    /* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓需配置↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
    uint32_t usartx;                         // 串口寄存器地址
    uint32_t port_tx;                        // tx脚端口
    uint32_t port_rx;                        // rx脚端口
    uint32_t pin_tx;                         // tx脚号
    uint32_t pin_rx;                         // rx脚号
    uint32_t overtime_ms;                    // 超时时间 仅支持GD32F4超时完成
    uint32_t baudrate;                       // 波特率
    uint32_t cfg_interrupt_priority;         // 抢占中断优先级 建议优先级分组设置为4组，4位抢占
    uint32_t cfg_tx_interrupt : 1;           // 发送中断使能
    uint32_t gd32usart_receive_overtime : 1; // gd32usart接收超时(完成)使能，不支持的配置无效
    enum {
        UART_LL_DATA_BIT_8,
        UART_LL_DATA_BIT_9,
    } uart_ll_data_bits;
    enum {
        UART_LL_STOP_BIT_1,   // 1bit
        UART_LL_STOP_BIT_0_5, // 0.5bit
        UART_LL_STOP_BIT_2,   // 2bit
        UART_LL_STOP_BIT_1_5, // 1.5bit
    } uart_ll_stop_bits;      // 停止位
    enum {
        UART_LL_PARITY_NONE,                      // 无校验
        UART_LL_PARITY_EVEN,                      // 偶校验
        UART_LL_PARITY_ODD,                       // 奇校验
    } uart_ll_parity;                             // 奇偶校验

    /* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑需配置↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
    uint8_t *pTx;                            // 指向发送缓冲区 不需要设置
    uint32_t txbuf_len;                      // 发送数据长度 不需要设置
    void *arg;                                 // 用户参数
    uart_ll_rx_interrupt_cb_t rx_cb;           // 接收中断回调
    uart_ll_rx_done_interrupt_cb_t rx_done_cb; // 接收完成回调

};


/***********************************Public Functions*******************************/

/**
 * @brief 初始化uart
 * @param  uct              
 * @param  rx_cb            接收回调
 * @param  arg              用户参数
 * @return int 0成功 -1失败
 * @note null
 */
int uart_ll_init(uart_ll_t *uct, uart_ll_rx_interrupt_cb_t rx_cb, void *arg);
/**
 * @brief 反初始化uart
 * @param  uct
 * @return int 0成功 -1失败
 * @note null
 */
int uart_ll_deinit(uart_ll_t *uct);
/**
 * @brief 设置接收完成回调 仅GD32F407接收超时支持
 * @param  ult              
 * @param  cb               
 * @return int 0成功 -1失败
 * @note null
 */
int uart_ll_set_rx_done_cb(uart_ll_t *ult, uart_ll_rx_done_interrupt_cb_t cb);
/**
 * @brief 发送指定长度的数据
 * @param  ult
 * @param  buf              发送的数据
 * @param  len_byte         数据的长度
 * @note null
 */
void uart_ll_putbuf(uart_ll_t *ult, uint8_t *buf, uint32_t len_byte);
/**
 * @brief 发送一个字节
 * @param  utt
 * @param  Sda              数据
 * @note null
 */
void uart_ll_write_byte(uart_ll_t *ult, uint16_t Sda);
/**
 * @brief UART发送中断使能
 * @param  usartx           USARTx
 * @note null
 */
void uart_ll_transmit_interrupt_enable(uart_ll_t *uct);
/**
 * @brief UART发送中断禁能
 * @param  usartx           USARTx
 * @note null
 */
void uart_ll_transmit_interrupt_disable(uart_ll_t *uct);
/**
 * @brief 获取UART接受超时标志
 * @param  usartx           USARTx
 * @return uint8_t 0未置位 1置位
 * @note null
 */
uint8_t uart_ll_receive_time_out_status(uart_ll_t *uct);
/**
 * @brief 清除UART接受超时标志
 * @param  usartx           USARTx
 * @note null
 */
void uart_ll_receive_time_out_rststatus(uart_ll_t *uct);
/**
 * @brief 获取UART接收寄存器非空标志
 * @param  usartx           USARTx
 * @return uint8_t 0未置位 1置位
 * @note null
 */
uint8_t uart_ll_receive_interrupt_status(uart_ll_t *uct);
/**
 * @brief 获取发送寄存器为空标志
 * @param  usartx           USARTx
 * @return uint8_t 0未置位 1置位
 * @note null
 */
uint8_t uart_ll_transmit_status(uart_ll_t *uct);
/**
 * @brief 获取发送完成标志
 * @param  usartx           USARTx
 * @return uint8_t 0未置位 1置位
 * @note null
 */
uint8_t uart_ll_transmit_complete(uart_ll_t *uct);
/**
 * @brief 获取UART发送寄存器为空标志
 * @param  usartx           USARTx
 * @return uint8_t 0未置位 1置位
 * @note null
 */
uint8_t uart_ll_transmit_interrupt_status(uart_ll_t *uct);
/**
 * @brief 获取UART接收寄存器
 * @param  usartx           USARTx
 * @return uint16_t 数据
 * @note null
 */
uint16_t uart_ll_get_receive_reg(uart_ll_t *uct);
/**
 * @brief 写UART发送寄存器
 * @param  usartx           USARTx
 * @param  data             发送的数据
 * @note null
 */
void uart_ll_set_transmit_reg(uart_ll_t *uct, uint16_t data);

/***************************************Public Variables**********************************/


#endif
/* [] END OF FILE */
